iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
1
  • 目錄
    • Introduce K8s service - Kube-proxy
    • Introduce K8s service - 4 ways to apply service(1)
    • @ Introduce K8s service - 4 ways to apply service(2) @
    • Service Comparison & Introduce Ingress
    • How to install Traefik
    • Service Debugging
    • Service Debugging

昨天介紹完前兩種, 今天要來介紹後兩種。


Load Balancer

如果對於Load Balance(負載平衡)還沒有了解的朋友們可以先看看這篇。

Load Balancer分為L4, L7 Load Balancer, 本篇提到的ELB(Elastic Load Balancer)是AWS提供的L4 Load Balancer, 有興趣的朋友可以直接參照官方文件以及這篇 Medium。裡面提到的ALB即是L7 Load Balancer

承上篇, 我們繼續為nginx1-7這個deployment加上Service, 這次我把Type設定成LoadBalancer。 我並沒有像官方文件一樣給出Loadbalancer IP,由於這個cluster是用Kops建在AWS instances上面的, 在這個Service建立伊始, AWS就會很貼心的幫你設定好一個新的ELB,然後在下個月份的請款日跟你請款

kind: Service
apiVersion: v1
metadata:
  name: lb-nginx
  namespace: default
  annotations:
    # by default the type is elb (classic load balancer).
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
  # this setting is to make sure the source IP address is preserved.
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app: nginx1-7
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443

建完之後

就可以在瀏覽器上直接輸入ELB的domain name, 即可看到結果。
![](https://i.imgur.com/7woBXLY.png =500x)

當然你也可以自己建立外部的Load balancer, 這邊是幾個常用的服務,如果你只是單純要Serve網頁,可以選用nginx,但是大部分人都會整合公有雲來管理。


ExternalName

ExternalName type在kubernetes 1.7 版本有提供,但是要使用的朋友要注意kube-dns version要在1.14.9以上,不然會遇到Resolve External Name issue

使用場景通常有兩個:

  1. 你想要直接連到外部服務, 可以直接將externalName設置為外部服務的CName
  2. 你想要namespace A的service可以指到namespace B, 可以參考這篇
    假使在namespace=kube-system有一個deployment叫做cheddar

    同時也有一條Service

這時候可以apply這樣的service:

kind: Service
apiVersion: v1
metadata:
  name: externalname-nginx
  namespace: default
spec:
  type: ExternalName
  externalName: cheddar.kube-system.svc.cluster.local
                (K8s預設的CName,格式為${service name}.${namespace}.svc.cluster.local)
  selector:
    app: cheddar

執行完之後:

用dig指令就可以看到確實指到這個cheddar service
![](https://i.imgur.com/pe34Rhy.png =500x)

直接curl 這個CName可以get該Pods的內容
![](https://i.imgur.com/qN0iFvh.png =500x)

ExternalName其實就是在Cluster的DNS Server添加一筆CName Record, 而且跟其他Service Types不一樣的是,這個網路流量不透過Kube-proxy處理,而是透過Kube-dns。

ExternalIPs

嚴格上來講這應該算是ClusterIP的外部IP版,ExternalIPs不算在四種Types裡面。
你可以指定一個外部的IP, 只要這個IP可以連到K8s cluster, 就可以透過這個IP連到
Pods。
有興趣的人可以自己參考官方文件

Reference

  1. 對比NodePort, LoadBalancerm and Ingress: https://imroc.io/posts/kubernetes/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what/
  2. AWS Load Balancer: https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html
  3. ALB & ELB: https://medium.com/@chihsuan/aws-load-balance-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E4%BB%8B%E7%B4%B9-33c30a59b596
  4. 小信豬k8s-Service-Overview: https://godleon.github.io/blog/Kubernetes/k8s-Service-Overview/
  5. 官方文件 ExternalName :https://kubernetes.io/docs/concepts/services-networking/service/#externalname
  6. Namespace A connect to Namespace B with ExternalName: https://akomljen.com/kubernetes-tips-part-1/
  7. ExternalIps: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips

上一篇
Oh my K8s service ! 談談如何暴露你的服務 - 2
下一篇
Oh my K8s service ! 談談如何暴露你的服務 - 4
系列文
其實我真的沒想過要利用夾縫中求生存的 30 天K8s可以怎麼用12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言